home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / e / kyz_obj.lha / test / cdtest.e < prev    next >
Text File  |  1998-10-18  |  9KB  |  238 lines

  1. OPT PREPROCESS
  2.  
  3. MODULE 'devices/cd', 'dos/rdargs', '*cdplayer'
  4.  
  5. DEF cd=NIL:PTR TO cdplayer, quit=FALSE
  6.  
  7.  
  8.  
  9. #define TEMPLATE 'currenttrack/s,discchanged/s,discinserted/s,eject/s,'+\
  10.   'ejected/s,insert/s,length/s,location/s,pause/s,paused/s,play/s,'+\
  11.   'playing/s,search/s,spindown/s,spinning/s,spinup/s,stop/s,trackinfo/s,'+\
  12.   'tracks/s,unpause/s,waitfordisc/s,'+\
  13.   'playtrack/s,fwd/s,back/s,info/s,help/s,quit=exit/s,arg1,arg2'
  14.  
  15. OBJECT cmd
  16.   currenttrack,discchanged,discinserted,eject,ejected,insert,length
  17.   location,pause,paused,play,playing,search,spindown,spinning,spinup
  18.   stop,trackinfo,tracks,unpause,waitfordisc
  19.   playtrack,fwd,back,info,help,quit,arg1,arg2
  20. ENDOBJECT
  21.  
  22. PROC main() HANDLE
  23.   DEF rdargs, args:PTR TO LONG, line[100]:STRING, c:cmd
  24.  
  25.   -> create CDPlayer object for device and unit specified on commandline
  26.   IF rdargs := ReadArgs('DEVICE,UNIT/N', args := ['cd.device', [0]], NIL)
  27.     NEW cd.open(args[0], Long(args[1]))
  28.     FreeArgs(rdargs)
  29.   ELSE
  30.     PrintFault(IoErr(), NIL)
  31.     RETURN 20
  32.   ENDIF
  33.  
  34.   -> main loop converts line from stdin into a cmd struct, and processes it
  35.   PutStr('type help for command list\n')
  36.   REPEAT
  37.     Write(stdout, '-> ', STRLEN)
  38.     IF Fgets(stdin, line, StrMax(line)-1)
  39.       IF args := NEW [line, StrLen(line), 0,NIL,NIL,0,NIL, RDAF_NOPROMPT]
  40.         IF rdargs := ReadArgs(TEMPLATE, clr(c, SIZEOF cmd), args)
  41.           process_cmd(c)
  42.           FreeArgs(rdargs)
  43.         ENDIF
  44.         END args
  45.       ENDIF
  46.     ENDIF
  47.   UNTIL quit
  48.  
  49. EXCEPT DO
  50.   IF exception THEN explain_cd_exception()
  51.   END cd
  52. ENDPROC
  53.  
  54.  
  55. -> returns the text name of a CDSEARCH mode
  56. #define SEARCHMODE(mode) ( \
  57.   IF      mode = CDSEARCH_FWD  THEN 'CDSEARCH_FWD'  \
  58.   ELSE IF mode = CDSEARCH_BACK THEN 'CDSEARCH_BACK' \
  59.   ELSE                              'CDSEARCH_STOP' \
  60. )
  61.  
  62. -> returns the text name of a CDTRACK type
  63. #define TRACKTYPE(type) ( \
  64.   IF      type = CDTRACK_DATA  THEN 'CDTRACK_DATA'    \
  65.   ELSE IF type = CDTRACK_AUDIO THEN 'CDTRACK_AUDIO'   \
  66.   ELSE                              'CDTRACK_INVALID' \
  67. )
  68.  
  69. -> prints information about the specified track
  70. PROC trackinfo(track)
  71.   DEF t,o,l; t,o,l := cd.trackinfo(track)
  72.   trck('track', track); Vprintf('type = \s\n', [TRACKTYPE(t)])
  73.   time('offset', o); time('length', l)
  74. ENDPROC
  75.  
  76. -> prints a boolean value
  77. PROC bool(name, val)
  78.   PutStr(name); PutStr(IF val THEN ' = TRUE\n' ELSE ' = FALSE\n')
  79. ENDPROC
  80.  
  81. -> prints a time value
  82. PROC time(name, val)
  83.   DEF m,s,f;  m,s,f := timeval(val)
  84.   PutStr(name); PutStr(' = ')
  85.   IF val = -1 THEN RETURN PutStr('CDTIME_INVALID\n')
  86. ENDPROC Vprintf('\d:\z\d[2]:\z\d[2]\n', [m,s,f])
  87.  
  88. -> prints a track number
  89. PROC trck(name, val)
  90.   PutStr(name); PutStr(' = ')
  91.   IF val = -1 THEN RETURN PutStr('CDTRACK_INVALID\n')
  92. ENDPROC Vprintf('\d\n', {val})
  93.  
  94.  
  95. PROC process_cmd(c:PTR TO cmd)
  96.   DEF mode, track, t, o, l
  97.  
  98.   IF c.currenttrack THEN trck('currenttrack', cd.currenttrack())
  99.   IF c.discchanged  THEN bool('discchanged', cd.discchanged())
  100.   IF c.discinserted THEN bool('discinserted', cd.discinserted())
  101.   IF c.eject        THEN cd.eject()
  102.   IF c.ejected      THEN bool('ejected', cd.ejected())
  103.   IF c.help         THEN help()
  104.   IF c.info         THEN FOR track := 1 TO cd.tracks() DO trackinfo(track)
  105.   IF c.insert       THEN cd.insert()
  106.   IF c.length       THEN time('length', cd.length())
  107.   IF c.location     THEN time('location', cd.location())
  108.   IF c.pause        THEN cd.pause()
  109.   IF c.paused       THEN bool('paused', cd.paused())
  110.   IF c.play         THEN bool('play()', cd.play(gettime(c.arg1), gettime(c.arg2)))
  111.   IF c.playing      THEN bool('playing', cd.playing())
  112.   IF c.quit         THEN quit := TRUE
  113.   IF c.spindown     THEN cd.spindown()
  114.   IF c.spinning     THEN bool('spinning', cd.spinning())
  115.   IF c.spinup       THEN cd.spinup()
  116.   IF c.stop         THEN cd.stop()
  117.   IF c.trackinfo    THEN trackinfo(Val(c.arg1))
  118.   IF c.tracks       THEN trck('tracks', cd.tracks())
  119.   IF c.unpause      THEN cd.unpause()
  120.   IF c.waitfordisc  THEN cd.waitfordisc()
  121.  
  122.   IF c.playtrack
  123.     IF track := Val(c.arg1)
  124.       t,o,l := cd.trackinfo(track); cd.play(o, l)
  125.     ELSE
  126.       cd.play(0, cd.length())
  127.     ENDIF
  128.   ENDIF
  129.  
  130.   IF c.search
  131.     mode := IF c.fwd  THEN CDSEARCH_FWD  ELSE IF
  132.                c.back THEN CDSEARCH_BACK ELSE CDSEARCH_STOP
  133.     mode := cd.search(mode)
  134.     Vprintf('search() = \s\n', [SEARCHMODE(mode)])
  135.   ENDIF
  136. ENDPROC
  137.  
  138.  
  139.  
  140.  
  141. PROC help()
  142.   PutStr('Commands:\n'+
  143.     'play <start> <length>  - plays <length> of CD from <start>\n'+
  144.     'stop                   - stop playing\n'+
  145.     'pause,unpause          - change pause mode\n'+
  146.     'search [fwd|back]      - enter/exit search mode\n'+
  147.     'spindown, spinup       - turn disc motor on/off\n'+
  148.     'eject,insert           - eject or insert CD drawer (some models only)\n\n'
  149.   )
  150.  
  151.   PutStr('Status commands:\n'+
  152.     'currenttrack           - prints current playing track\n'+
  153.     'discchanged            - prints TRUE if disc has been changed\n'+
  154.     'discinserted           - prints TRUE if a disc is currently inserted\n'+
  155.     'ejected                - prints TRUE if CD drawer/door is open\n'+
  156.     'info                   - prints CDs table of contents\n'+
  157.     'length                 - prints length of CD in minutes/seconds/frames\n'+
  158.     'location               - prints current playing location on CD\n'+
  159.     'paused                 - prints TRUE if currently in pause mode\n'+
  160.     'playing                - prints TRUE if currently playing\n'+
  161.     'spinning               - prints TRUE if disc motor is running\n'+
  162.     'trackinfo <track>      - prints info about track <track>\n'+
  163.     'tracks                 - prints number of tracks on the CD\n\n'
  164.   )
  165.  
  166.   PutStr('Misc:\n'+
  167.     'playtrack [track]      - plays [track] or whole CD\n'+
  168.     'waitfordisc            - wait until a valid CD is inserted\n'+
  169.     'help                   - prints this screen \n'+
  170.     'quit, exit             - end the program\n\n'
  171.   )
  172. ENDPROC
  173.  
  174. PROC explain_cd_exception()
  175.   SELECT exception
  176.   CASE CDPERR_INIT;        PutStr('Initialisation error.\n')
  177.   CASE CDPERR_OPENDEV;        PutStr('Cannot open CD device: ')
  178.   CASE CDPERR_DEVICE;        PutStr('I/O error with CD device: ')
  179.   DEFAULT;            Vprintf('Unknown exception $\h\n', {exception})
  180.   ENDSELECT
  181.  
  182.   SELECT exceptioninfo
  183.   CASE CDERR_OPENFAIL;        PutStr('device/unit failed to open\n')
  184.   CASE CDERR_ABORTED;        PutStr('request terminated early\n')
  185.   CASE CDERR_NOCMD;        PutStr('command not supported by device\n')
  186.   CASE CDERR_BADLENGTH;        PutStr('invalid length (IO_LENGTH/IO_OFFSET)\n')
  187.   CASE CDERR_BADADDRESS;    PutStr('invalid address (IO_DATA misaligned)\n')
  188.   CASE CDERR_UNITBUSY;        PutStr('device opens ok, but unit is busy\n')
  189.   CASE CDERR_SELFTEST;        PutStr('hardware failed self-test\n')
  190.   CASE CDERR_NOTSPECIFIED;    PutStr('general catchall\n')
  191.   CASE CDERR_NOSECHDR;        PutStr('couldn\at even find a sector\n')
  192.   CASE CDERR_BADSECPREAMBLE;    PutStr('sector looked wrong\n')
  193.   CASE CDERR_BADSECID;        PutStr('sector looked wrong\n')
  194.   CASE CDERR_BADHDRSUM;        PutStr('header had incorrect checksum\n')
  195.   CASE CDERR_BADSECSUM;        PutStr('data had incorrect checksum\n')
  196.   CASE CDERR_TOOFEWSECS;    PutStr('couldn\at find enough sectors\n')
  197.   CASE CDERR_BADSECHDR;        PutStr('sector looked wrong\n')
  198.   CASE CDERR_WRITEPROT;        PutStr('can\at write to a protected disk\n')
  199.   CASE CDERR_NODISK;        PutStr('no disk in the drive\n')
  200.   CASE CDERR_SEEKERROR;        PutStr('couldn\at find track 0\n')
  201.   CASE CDERR_NOMEM;        PutStr('ran out of memory\n')
  202.   CASE CDERR_BADUNITNUM;    PutStr('asked for a unit > NUMUNITS\n')
  203.   CASE CDERR_BADDRIVETYPE;    PutStr('not a drive cd.device understands\n')
  204.   CASE CDERR_DRIVEINUSE;    PutStr('someone else allocated the drive\n')
  205.   CASE CDERR_POSTRESET;        PutStr('user hit reset; awaiting doom\n')
  206.   CASE CDERR_BADDATATYPE;    PutStr('data on disk is wrong type\n')
  207.   CASE CDERR_INVALIDSTATE;    PutStr('invalid cmd under current conditions\n')
  208.   CASE CDERR_PHASE;        PutStr('illegal or unexpected SCSI phase\n')
  209.   CASE CDERR_NOBOARD;        PutStr('open failed for non-existant board\n')
  210.   DEFAULT;            Vprintf('unknown reason \d\n', {exceptioninfo})
  211.   ENDSELECT
  212. ENDPROC
  213.  
  214.  
  215.  
  216. -> converts a string in the form 'mm:ss:ff', 'mm:ss' or 'mm:'
  217. -> into an LSN timevalue
  218. PROC gettime(str)
  219.   DEF m=0, s=0, f=0
  220.  
  221.   WHILE (str[] >= "0")